#include <stdio.h>

#include <iostream>
using namespace std;

// 编译时加 -fno-stack-protector 选项

void testOutofArray() {
  int i;
  cout << "&i=" << &i << endl;
  int arr[3];
  cout << "&arr=" << &arr << endl;
  // 在Linux进程的内存布局中，栈区在高地址空间，从高向低增长
  // gcc有一个编译选项（-fno-stack-protector）用于关闭堆栈保护功能。默认情况下启动了堆栈保护，不管i声明在前还是在后，i都会在数组之后压栈，只会循环4次；如果关闭堆栈保护功能，则会出现死循环
  // 编译器64位操作系统下 默认会进行8字节对齐，数组大小为4时就不会死循环了
  for (i = 0; i <= 3; ++i) {
    arr[i] = 0;
    printf("arr[%d]=%d %p\n", i, arr[i], &arr[i]);
  }
}

void test2Array() {
  const int row = 2;
  const int col = 3;
  int arr[row][col] = {{0, 1, 2}, {1, 2, 3}};
  for (int i = 0; i < row; ++i) {
    for (int j = 0; j < col; ++j) {
      cout << arr[i][j] << ',' << *(&arr[0][0] + i * col + j) << ' ';
    }
    cout << endl;
  }
}

int main() {
  // testOutofArray();
  test2Array();
  return 0;
}